One possibility of achieving this would be to create a custom module with an event observer on 'controller_action_postdispatch_checkout_onepage_saveBilling'-event. In your module's config.xml under the global/events node put this:
<controller_action_postdispatch_checkout_onepage_saveBilling><!-- when a billing address is saved check for double discounts -->
<observers>
<yourmodule_observer_check_double_discount>
<type>singleton</type>
<class>namespace_yourmodule/observer</class>
<method>checkForDoubleDiscount</method>
</yourmodule_observer_check_double_discount>
</observers>
</controller_action_postdispatch_checkout_onepage_saveBilling>
When a customer saves the billing address you might apply your custom validation logic in your event observer like this:
public function checkForDoubleDiscount($observer) {
$sess = Mage::getSingleton('checkout/session');
$quote = $sess->getQuote();
//check if quote has discount
$coupon_code = $quote->getCouponCode();
if($coupon_code){
//check if email address is set
if($email = $quote->getCustomerEmail()) {
//get salesrule
$coupon = Mage::getModel('salesrule/coupon')->load($coupon_code, 'code');
$rule = Mage::getModel('salesrule/rule')->load($coupon->getRuleId());
//check if usage limit exists
if($maxuse = $rule->getUsesPerCustomer()) {
//get all orders of the customer
$order = Mage::getModel('sales/order');
$collection = $order->getCollection()
->addAttributeToFilter('customer_email',array('like'=>$email))
->addAttributeToFilter('coupon_code',array('like'=>$coupon_code));
//if max usage is reached, remove rule from quote
if($maxuse <= $collection->count()) {
$quote->setCouponCode('')->collectTotals()->save();
$message = Mage::helper('namespace_yourmodule');->__('Coupon Code %s has been cancelled, the usage limit has been reached', $coupon_code);
$result = array();
$result['error'] = '-1';
$result['message'] = $message;
print Mage::helper('core')->jsonEncode($result); exit;
break;
}
}
}
}
}
}
Please note: The above code requires the creation of a custom module, you can find a LOT of sources on how to do that on Google. You might as well use other Magento events or a more detailed, maybe address based validation which might better suit your needs, this is just a basic example way of how to do it by simply validating an email address. I also suggest to implement a strtolower-like conversion of the coupon codes or something like that because query results might change with the use of letter cases in the code (Magento treats 'AABB' and 'aabb' coupon codes similar, but your database might not)